iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

初探後端世界-使用Node.js框架開發網頁系列 第 9

你需要知道的9個元件功能介紹 -8(Guard)

  • 分享至 

  • xImage
  •  

Guard的主要用途為驗證與授權,執行在Middleware之後、interceptor之前

設計Guard

產生Guard

NestCLI指令:
$nest g guard <GUARD_NAME>

產生後的程式碼:

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()

export class AuthGuard implements CanActivate {

canActivate(

context: ExecutionContext,

): boolean | Promise<boolean> | Observable<boolean> {

return true;

}

}

基本骨架解析:

  1. 帶有一個 @Injectable裝飾器的類別,實作了CanActive介面,需要自行設計canActive方法
  2. canActive方法的回傳值可以是同步(Promise)或非同步(Observable)
  3. canActive方法的ExecutionContext參數用來提取需要用來驗證的資料

使用Guard:

和Exception filter差不多,根據需求分成兩種:

1.只針對單一Handler:添加的@UseGuards(<GUARD_NAME>)擺放位置在該Handler上

(在app.controller.ts中)

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AppService } from './app.service';
import { AuthGuard } from './guards/auth/auth.guard';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @UseGuards(AuthGuard)
  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

2.針對Controller中的所有Handler:@UseGuards(<GUARD_NAME>)擺放位置在Controller上

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AppService } from './app.service';
import { AuthGuard } from './guards/auth/auth.guard';

@UseGuards(AuthGuard)
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

上一篇
你需要知道的9個元件功能介紹 -7(Interceptor)
下一篇
你需要知道的9個元件功能介紹 -9(自訂裝飾器)
系列文
初探後端世界-使用Node.js框架開發網頁12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言